// 引入必要的命名空间
using Microsoft.AspNetCore.Authorization; // 提供授权相关的功能
using Microsoft.AspNetCore.Mvc; // 提供MVC控制器和ActionResult支持
using UniversalAdmin.Application.DTOs; // 引入数据传输对象定义
using UniversalAdmin.Application.Services; // 引入服务层接口和实现

// 定义控制器的命名空间
namespace UniversalAdmin.Api.Controllers;

// 标记该类为API控制器
[ApiController]
// 定义路由模板，v1表示API版本，[controller]会自动替换为控制器名称
[Route("api/v1/[controller]")]
// 继承自ControllerBase，提供基础的控制器功能
public class OperationLogController : ControllerBase
{
    // 注入操作日志服务接口
    private readonly IOperationLogService _logService;

    // 构造函数，依赖注入IOperationLogService
    public OperationLogController(IOperationLogService logService)
    {
        _logService = logService;
    }

    // HTTP GET方法，获取操作日志列表，支持分页和多种查询条件
    [HttpGet]
    public async Task<IActionResult> GetLogs([FromQuery] LogQueryDto query)
    {
        // 调用服务层获取日志列表，传入查询条件
        var logs = await _logService.GetLogsAsync(
            query.Page,
            query.PageSize,
            query.UserId,
            query.Operation,
            query.StartDate,
            query.EndDate);
        // 返回200 OK响应，包含日志列表
        return Ok(logs);
    }

    // HTTP GET方法，根据ID获取单个操作日志
    [HttpGet("{id}")]
    public async Task<IActionResult> GetLogById(Guid id)
    {
        // 调用服务层根据ID获取日志
        var log = await _logService.GetLogByIdAsync(id);
        // 如果日志不存在，返回404 Not Found响应
        if (log == null)
            return NotFound(new { message = "日志不存在" });
        // 返回200 OK响应，包含日志信息
        return Ok(log);
    }

    // HTTP GET方法，根据用户ID获取操作日志列表，支持分页
    [HttpGet("user/{userId}")]
    public async Task<IActionResult> GetLogsByUser(Guid userId, [FromQuery] int page = 1, [FromQuery] int pageSize = 10)
    {
        // 调用服务层根据用户ID获取日志列表
        var logs = await _logService.GetLogsByUserAsync(userId, page, pageSize);
        // 返回200 OK响应，包含日志列表
        return Ok(logs);
    }

    // HTTP GET方法，根据操作类型获取操作日志列表，支持分页
    [HttpGet("operation/{operation}")]
    public async Task<IActionResult> GetLogsByOperation(string operation, [FromQuery] int page = 1, [FromQuery] int pageSize = 10)
    {
        // 调用服务层根据操作类型获取日志列表
        var logs = await _logService.GetLogsByOperationAsync(operation, page, pageSize);
        // 返回200 OK响应，包含日志列表
        return Ok(logs);
    }

    // HTTP GET方法，根据日期范围获取操作日志列表，支持分页
    [HttpGet("daterange")]
    public async Task<IActionResult> GetLogsByDateRange([FromQuery] DateTime startDate, [FromQuery] DateTime endDate, [FromQuery] int page = 1, [FromQuery] int pageSize = 10)
    {
        // 调用服务层根据日期范围获取日志列表
        var logs = await _logService.GetLogsByDateRangeAsync(startDate, endDate, page, pageSize);
        // 返回200 OK响应，包含日志列表
        return Ok(logs);
    }

    // HTTP POST方法，创建新的操作日志
    [HttpPost]
    public async Task<IActionResult> CreateLog([FromBody] CreateOperationLogDto dto)
    {
        try
        {
            // 调用服务层创建日志
            var log = await _logService.CreateLogAsync(dto);
            // 返回201 Created响应，包含新日志的URI和日志信息
            return CreatedAtAction(nameof(GetLogById), new { id = log.Id }, log);
        }
        catch (Exception ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }
}